from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
import jieba


# 读取dat文件方法，用于读取停止词
def read_dat(file_name):
    fp = open(file_name, "r", encoding="utf-8")
    content_lines = fp.readlines()
    fp.close()
    # 去除行末的换行符，否则会在停用词匹配的过程中产生干扰
    for i in range(len(content_lines)):
        content_lines[i] = content_lines[i].rstrip("\n")
    return content_lines


# 按行读取样本文件
with open(r'comment.txt') as f1:
    documents = f1.readlines()

# 写死的测试样本
# documents = ["舆情监测的作用，舆情监测是指整合互联网信息采集技术及信息智能处理技术，通过对互联网海量信息自动抓取、自动分类聚类、主题检测、专题聚焦",
#              "实现用户的网络舆情监测和新闻专题追踪等信息需求，形成简报、报告、图表等分析结果",
#              "公共危机事件爆发时，犹如以石击水，相关信息在短时间内迅速传播，引起群众的广泛关注",
#              "甚至影响到群众对党和政府的信任，影响到消费者对某一企业品牌的认同"]

# 读取停止词文件，分词过程遇到停止词会过滤
stopword_file = 'stopwords.dat'
stopwords = read_dat(stopword_file)

# 使用jieba进行分词TfidfVectorizer
sent_words = [list(jieba.cut(sent0, cut_all=False)) for sent0 in documents if sent0 not in stopwords]
splitDocuments = [" ".join(sent0) for sent0 in sent_words]
print(splitDocuments)

# 使用TfidfVectorizer矢量化器进行建模
vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b", max_df=0.6)
data = vectorizer.fit_transform(splitDocuments)
# 训练集分类的数量
true_k = 5

# 使用kmeans进行样本训练，max_iter和n_init的参数可调
# n_init : int, default=10 使用不同质心种子运行 k-means 算法的次数。就惯性而言，最终结果将是 n_init 连续运行的最佳输出。
# max_iter : int, default=300 k-means 算法单次运行的最大迭代次数。
clustering_model = KMeans(n_clusters=true_k,
                          init='k-means++',
                          max_iter=300, n_init=1)
clustering_model.fit(data)

# 输出结果
print("每个集群的热门词:")

# 集群词排序
sorted_centroids = clustering_model.cluster_centers_.argsort()[:, ::-1]
terms = vectorizer.get_feature_names()

for i in range(true_k):
    print("Cluster %d:" % i, end='')
    count = 0
    for ind in sorted_centroids[i, :100]:
        # 过滤掉长度为1的集群词，以提高预测精确度
        if len(terms[ind]) == 2:
            print(' %s' % terms[ind], end='')
            count = count + 1
        if count > 10:
            break
    print()

# 样本倾向性预测，可以根据建模进行后续样本的预测
# print()
# print("预测:")
# new_doc = ["“既然奋斗无出路，干脆躺平做咸鱼”，近年来以三和大神和“窃格瓦拉”的走红为代表，一部分人妄图通过逃避工作来实现逃避剥削、走出内卷的目的。"]
# sent_words = [list(jieba.cut(sent0)) for sent0 in new_doc]
# splitDocuments = [" ".join(sent0) for sent0 in sent_words]
# print(splitDocuments)
# Y = vectorizer.transform(splitDocuments)
# prediction = clustering_model.predict(Y)
# print(prediction)
#
# new_doc = ["内卷的首要条件，就是有足够多相同目标的人。资本家对内卷最大的贡献，就是靠扩大欲望，把很多人集中到鄙视链的上升路径中。"]
# sent_words = [list(jieba.cut(sent0)) for sent0 in new_doc]
# splitDocuments = [" ".join(sent0) for sent0 in sent_words]
# print(splitDocuments)
# Y = vectorizer.transform(splitDocuments)
# prediction = clustering_model.predict(Y)
# print(prediction)
